const items = [
  { id: 1, name: 'Item 1', parentId: null },
  { id: 2, name: 'Item 1.1', parentId: 1 },
  { id: 3, name: 'Item 1.2', parentId: 1 },
  { id: 4, name: 'Item 2', parentId: null },
  { id: 5, name: 'Item 2.1', parentId: 4 },
  // ... 更多的项⽬
];

function buildTree(objArr) {
  // map用于快速查找结点
  let map = {}, tree = [];

  // 初始化map --- 给每个对象节点加一个孩子数组
  objArr.forEach(item => {
    map[item.id] = {...item, children: []}
  })

  // 遍历数据--构建父子关系
  objArr.forEach(item => {
    let node = map[item.id];
    // 说明是顶层节点
    if (node.parentId === null) {
      tree.push(node)
    } else {
      // 说明有父亲--将当前节点加入到父亲的children数组中
      if (map[item.parentId]) {
        map[item.parentId].children.push(node);
      }
    }
  })
  
  return tree;
}

console.log(buildTree(items))